home *** CD-ROM | disk | FTP | other *** search
/ Champak 141 / (Vol 141) Oct 17 2011.iso / Games / despereaux-swings.swf / scripts / Box2D / Collision / b2Distance.as < prev    next >
Encoding:
Text File  |  2011-10-17  |  16.6 KB  |  431 lines

  1. package Box2D.Collision
  2. {
  3.    import Box2D.Collision.Shapes.*;
  4.    import Box2D.Common.*;
  5.    import Box2D.Common.Math.*;
  6.    
  7.    public class b2Distance
  8.    {
  9.       
  10.       private static var s_p2s:Array = [new b2Vec2(),new b2Vec2(),new b2Vec2()];
  11.       
  12.       private static var s_p1s:Array = [new b2Vec2(),new b2Vec2(),new b2Vec2()];
  13.       
  14.       private static var s_points:Array = [new b2Vec2(),new b2Vec2(),new b2Vec2()];
  15.       
  16.       private static var gPoint:b2Point = new b2Point();
  17.       
  18.       public static var g_GJK_Iterations:int = 0;
  19.        
  20.       
  21.       public function b2Distance()
  22.       {
  23.          super();
  24.       }
  25.       
  26.       public static function InPoints(param1:b2Vec2, param2:Array, param3:int) : Boolean
  27.       {
  28.          var _loc4_:Number = NaN;
  29.          var _loc5_:int = 0;
  30.          var _loc6_:b2Vec2 = null;
  31.          var _loc7_:Number = NaN;
  32.          var _loc8_:Number = NaN;
  33.          var _loc9_:Number = NaN;
  34.          var _loc10_:Number = NaN;
  35.          _loc4_ = 100 * Number.MIN_VALUE;
  36.          _loc5_ = 0;
  37.          while(_loc5_ < param3)
  38.          {
  39.             _loc6_ = param2[_loc5_];
  40.             _loc7_ = Math.abs(param1.x - _loc6_.x);
  41.             _loc8_ = Math.abs(param1.y - _loc6_.y);
  42.             _loc9_ = Math.max(Math.abs(param1.x),Math.abs(_loc6_.x));
  43.             _loc10_ = Math.max(Math.abs(param1.y),Math.abs(_loc6_.y));
  44.             if(_loc7_ < _loc4_ * (_loc9_ + 1) && _loc8_ < _loc4_ * (_loc10_ + 1))
  45.             {
  46.                return true;
  47.             }
  48.             _loc5_++;
  49.          }
  50.          return false;
  51.       }
  52.       
  53.       public static function DistanceGeneric(param1:b2Vec2, param2:b2Vec2, param3:*, param4:b2XForm, param5:*, param6:b2XForm) : Number
  54.       {
  55.          var _loc7_:b2Vec2 = null;
  56.          var _loc8_:Array = null;
  57.          var _loc9_:Array = null;
  58.          var _loc10_:Array = null;
  59.          var _loc11_:int = 0;
  60.          var _loc12_:Number = NaN;
  61.          var _loc13_:int = 0;
  62.          var _loc14_:int = 0;
  63.          var _loc15_:Number = NaN;
  64.          var _loc16_:Number = NaN;
  65.          var _loc17_:b2Vec2 = null;
  66.          var _loc18_:b2Vec2 = null;
  67.          var _loc19_:Number = NaN;
  68.          var _loc20_:Number = NaN;
  69.          var _loc21_:Number = NaN;
  70.          var _loc22_:Number = NaN;
  71.          var _loc23_:int = 0;
  72.          _loc8_ = s_p1s;
  73.          _loc9_ = s_p2s;
  74.          _loc10_ = s_points;
  75.          _loc11_ = 0;
  76.          param1.SetV(param3.GetFirstVertex(param4));
  77.          param2.SetV(param5.GetFirstVertex(param6));
  78.          _loc12_ = 0;
  79.          _loc13_ = 20;
  80.          _loc14_ = 0;
  81.          while(_loc14_ < _loc13_)
  82.          {
  83.             _loc15_ = param2.x - param1.x;
  84.             _loc16_ = param2.y - param1.y;
  85.             _loc17_ = param3.Support(param4,_loc15_,_loc16_);
  86.             _loc18_ = param5.Support(param6,-_loc15_,-_loc16_);
  87.             _loc12_ = _loc15_ * _loc15_ + _loc16_ * _loc16_;
  88.             _loc19_ = _loc18_.x - _loc17_.x;
  89.             _loc20_ = _loc18_.y - _loc17_.y;
  90.             _loc21_ = _loc15_ * _loc19_ + _loc16_ * _loc20_;
  91.             if(_loc12_ - (_loc15_ * _loc19_ + _loc16_ * _loc20_) <= 0.01 * _loc12_)
  92.             {
  93.                if(_loc11_ == 0)
  94.                {
  95.                   param1.SetV(_loc17_);
  96.                   param2.SetV(_loc18_);
  97.                }
  98.                g_GJK_Iterations = _loc14_;
  99.                return Math.sqrt(_loc12_);
  100.             }
  101.             switch(_loc11_)
  102.             {
  103.                case 0:
  104.                   (_loc7_ = _loc8_[0]).SetV(_loc17_);
  105.                   (_loc7_ = _loc9_[0]).SetV(_loc18_);
  106.                   (_loc7_ = _loc10_[0]).x = _loc19_;
  107.                   _loc7_.y = _loc20_;
  108.                   param1.SetV(_loc8_[0]);
  109.                   param2.SetV(_loc9_[0]);
  110.                   _loc11_++;
  111.                   break;
  112.                case 1:
  113.                   (_loc7_ = _loc8_[1]).SetV(_loc17_);
  114.                   (_loc7_ = _loc9_[1]).SetV(_loc18_);
  115.                   (_loc7_ = _loc10_[1]).x = _loc19_;
  116.                   _loc7_.y = _loc20_;
  117.                   _loc11_ = ProcessTwo(param1,param2,_loc8_,_loc9_,_loc10_);
  118.                   break;
  119.                case 2:
  120.                   (_loc7_ = _loc8_[2]).SetV(_loc17_);
  121.                   (_loc7_ = _loc9_[2]).SetV(_loc18_);
  122.                   (_loc7_ = _loc10_[2]).x = _loc19_;
  123.                   _loc7_.y = _loc20_;
  124.                   _loc11_ = ProcessThree(param1,param2,_loc8_,_loc9_,_loc10_);
  125.             }
  126.             if(_loc11_ == 3)
  127.             {
  128.                g_GJK_Iterations = _loc14_;
  129.                return 0;
  130.             }
  131.             _loc22_ = -Number.MAX_VALUE;
  132.             _loc23_ = 0;
  133.             while(_loc23_ < _loc11_)
  134.             {
  135.                _loc7_ = _loc10_[_loc23_];
  136.                _loc22_ = b2Math.b2Max(_loc22_,_loc7_.x * _loc7_.x + _loc7_.y * _loc7_.y);
  137.                _loc23_++;
  138.             }
  139.             if(_loc11_ == 3 || _loc12_ <= 100 * Number.MIN_VALUE * _loc22_)
  140.             {
  141.                g_GJK_Iterations = _loc14_;
  142.                _loc15_ = param2.x - param1.x;
  143.                _loc16_ = param2.y - param1.y;
  144.                _loc12_ = _loc15_ * _loc15_ + _loc16_ * _loc16_;
  145.                return Math.sqrt(_loc12_);
  146.             }
  147.             _loc14_++;
  148.          }
  149.          g_GJK_Iterations = _loc13_;
  150.          return Math.sqrt(_loc12_);
  151.       }
  152.       
  153.       public static function DistanceCC(param1:b2Vec2, param2:b2Vec2, param3:b2CircleShape, param4:b2XForm, param5:b2CircleShape, param6:b2XForm) : Number
  154.       {
  155.          var _loc7_:b2Mat22 = null;
  156.          var _loc8_:b2Vec2 = null;
  157.          var _loc9_:Number = NaN;
  158.          var _loc10_:Number = NaN;
  159.          var _loc11_:Number = NaN;
  160.          var _loc12_:Number = NaN;
  161.          var _loc13_:Number = NaN;
  162.          var _loc14_:Number = NaN;
  163.          var _loc15_:Number = NaN;
  164.          var _loc16_:Number = NaN;
  165.          var _loc17_:Number = NaN;
  166.          var _loc18_:Number = NaN;
  167.          var _loc19_:Number = NaN;
  168.          var _loc20_:Number = NaN;
  169.          _loc7_ = param4.R;
  170.          _loc8_ = param3.m_localPosition;
  171.          _loc9_ = param4.position.x + (_loc7_.col1.x * _loc8_.x + _loc7_.col2.x * _loc8_.y);
  172.          _loc10_ = param4.position.y + (_loc7_.col1.y * _loc8_.x + _loc7_.col2.y * _loc8_.y);
  173.          _loc7_ = param6.R;
  174.          _loc8_ = param5.m_localPosition;
  175.          _loc11_ = param6.position.x + (_loc7_.col1.x * _loc8_.x + _loc7_.col2.x * _loc8_.y);
  176.          _loc12_ = param6.position.y + (_loc7_.col1.y * _loc8_.x + _loc7_.col2.y * _loc8_.y);
  177.          _loc13_ = _loc11_ - _loc9_;
  178.          _loc14_ = _loc12_ - _loc10_;
  179.          _loc15_ = _loc13_ * _loc13_ + _loc14_ * _loc14_;
  180.          _loc16_ = param3.m_radius - b2Settings.b2_toiSlop;
  181.          _loc17_ = param5.m_radius - b2Settings.b2_toiSlop;
  182.          _loc18_ = _loc16_ + _loc17_;
  183.          if(_loc15_ > _loc18_ * _loc18_)
  184.          {
  185.             _loc19_ = Math.sqrt(_loc13_ * _loc13_ + _loc14_ * _loc14_);
  186.             _loc13_ /= _loc19_;
  187.             _loc14_ /= _loc19_;
  188.             _loc20_ = _loc19_ - _loc18_;
  189.             param1.x = _loc9_ + _loc16_ * _loc13_;
  190.             param1.y = _loc10_ + _loc16_ * _loc14_;
  191.             param2.x = _loc11_ - _loc17_ * _loc13_;
  192.             param2.y = _loc12_ - _loc17_ * _loc14_;
  193.             return _loc20_;
  194.          }
  195.          if(_loc15_ > Number.MIN_VALUE * Number.MIN_VALUE)
  196.          {
  197.             _loc19_ = Math.sqrt(_loc13_ * _loc13_ + _loc14_ * _loc14_);
  198.             _loc13_ /= _loc19_;
  199.             _loc14_ /= _loc19_;
  200.             param1.x = _loc9_ + _loc16_ * _loc13_;
  201.             param1.y = _loc10_ + _loc16_ * _loc14_;
  202.             param2.x = param1.x;
  203.             param2.y = param1.y;
  204.             return 0;
  205.          }
  206.          param1.x = _loc9_;
  207.          param1.y = _loc10_;
  208.          param2.x = param1.x;
  209.          param2.y = param1.y;
  210.          return 0;
  211.       }
  212.       
  213.       public static function ProcessThree(param1:b2Vec2, param2:b2Vec2, param3:Array, param4:Array, param5:Array) : int
  214.       {
  215.          var _loc6_:b2Vec2 = null;
  216.          var _loc7_:b2Vec2 = null;
  217.          var _loc8_:b2Vec2 = null;
  218.          var _loc9_:b2Vec2 = null;
  219.          var _loc10_:b2Vec2 = null;
  220.          var _loc11_:b2Vec2 = null;
  221.          var _loc12_:b2Vec2 = null;
  222.          var _loc13_:b2Vec2 = null;
  223.          var _loc14_:b2Vec2 = null;
  224.          var _loc15_:Number = NaN;
  225.          var _loc16_:Number = NaN;
  226.          var _loc17_:Number = NaN;
  227.          var _loc18_:Number = NaN;
  228.          var _loc19_:Number = NaN;
  229.          var _loc20_:Number = NaN;
  230.          var _loc21_:Number = NaN;
  231.          var _loc22_:Number = NaN;
  232.          var _loc23_:Number = NaN;
  233.          var _loc24_:Number = NaN;
  234.          var _loc25_:Number = NaN;
  235.          var _loc26_:Number = NaN;
  236.          var _loc27_:Number = NaN;
  237.          var _loc28_:Number = NaN;
  238.          var _loc29_:Number = NaN;
  239.          var _loc30_:Number = NaN;
  240.          var _loc31_:Number = NaN;
  241.          var _loc32_:Number = NaN;
  242.          var _loc33_:Number = NaN;
  243.          var _loc34_:Number = NaN;
  244.          var _loc35_:Number = NaN;
  245.          var _loc36_:Number = NaN;
  246.          var _loc37_:Number = NaN;
  247.          var _loc38_:Number = NaN;
  248.          var _loc39_:Number = NaN;
  249.          var _loc40_:Number = NaN;
  250.          var _loc41_:Number = NaN;
  251.          _loc6_ = param5[0];
  252.          _loc7_ = param5[1];
  253.          _loc8_ = param5[2];
  254.          _loc9_ = param3[0];
  255.          _loc10_ = param3[1];
  256.          _loc11_ = param3[2];
  257.          _loc12_ = param4[0];
  258.          _loc13_ = param4[1];
  259.          _loc14_ = param4[2];
  260.          _loc15_ = _loc6_.x;
  261.          _loc16_ = _loc6_.y;
  262.          _loc17_ = _loc7_.x;
  263.          _loc18_ = _loc7_.y;
  264.          _loc19_ = _loc8_.x;
  265.          _loc20_ = _loc8_.y;
  266.          _loc21_ = _loc17_ - _loc15_;
  267.          _loc22_ = _loc18_ - _loc16_;
  268.          _loc23_ = _loc19_ - _loc15_;
  269.          _loc24_ = _loc20_ - _loc16_;
  270.          _loc25_ = _loc19_ - _loc17_;
  271.          _loc26_ = _loc20_ - _loc18_;
  272.          _loc27_ = -(_loc15_ * _loc21_ + _loc16_ * _loc22_);
  273.          _loc28_ = _loc17_ * _loc21_ + _loc18_ * _loc22_;
  274.          _loc29_ = -(_loc15_ * _loc23_ + _loc16_ * _loc24_);
  275.          _loc30_ = _loc19_ * _loc23_ + _loc20_ * _loc24_;
  276.          _loc31_ = -(_loc17_ * _loc25_ + _loc18_ * _loc26_);
  277.          _loc32_ = _loc19_ * _loc25_ + _loc20_ * _loc26_;
  278.          if(_loc30_ <= 0 && _loc32_ <= 0)
  279.          {
  280.             param1.SetV(_loc11_);
  281.             param2.SetV(_loc14_);
  282.             _loc9_.SetV(_loc11_);
  283.             _loc12_.SetV(_loc14_);
  284.             _loc6_.SetV(_loc8_);
  285.             return 1;
  286.          }
  287.          _loc34_ = (_loc33_ = _loc21_ * _loc24_ - _loc22_ * _loc23_) * (_loc15_ * _loc18_ - _loc16_ * _loc17_);
  288.          if((_loc36_ = _loc33_ * (_loc17_ * _loc20_ - _loc18_ * _loc19_)) <= 0 && _loc31_ >= 0 && _loc32_ >= 0 && _loc31_ + _loc32_ > 0)
  289.          {
  290.             _loc35_ = _loc31_ / (_loc31_ + _loc32_);
  291.             param1.x = _loc10_.x + _loc35_ * (_loc11_.x - _loc10_.x);
  292.             param1.y = _loc10_.y + _loc35_ * (_loc11_.y - _loc10_.y);
  293.             param2.x = _loc13_.x + _loc35_ * (_loc14_.x - _loc13_.x);
  294.             param2.y = _loc13_.y + _loc35_ * (_loc14_.y - _loc13_.y);
  295.             _loc9_.SetV(_loc11_);
  296.             _loc12_.SetV(_loc14_);
  297.             _loc6_.SetV(_loc8_);
  298.             return 2;
  299.          }
  300.          if((_loc37_ = _loc33_ * (_loc19_ * _loc16_ - _loc20_ * _loc15_)) <= 0 && _loc29_ >= 0 && _loc30_ >= 0 && _loc29_ + _loc30_ > 0)
  301.          {
  302.             _loc35_ = _loc29_ / (_loc29_ + _loc30_);
  303.             param1.x = _loc9_.x + _loc35_ * (_loc11_.x - _loc9_.x);
  304.             param1.y = _loc9_.y + _loc35_ * (_loc11_.y - _loc9_.y);
  305.             param2.x = _loc12_.x + _loc35_ * (_loc14_.x - _loc12_.x);
  306.             param2.y = _loc12_.y + _loc35_ * (_loc14_.y - _loc12_.y);
  307.             _loc10_.SetV(_loc11_);
  308.             _loc13_.SetV(_loc14_);
  309.             _loc7_.SetV(_loc8_);
  310.             return 2;
  311.          }
  312.          _loc38_ = _loc36_ + _loc37_ + _loc34_;
  313.          _loc38_ = 1 / _loc38_;
  314.          _loc39_ = _loc36_ * _loc38_;
  315.          _loc40_ = _loc37_ * _loc38_;
  316.          _loc41_ = 1 - _loc39_ - _loc40_;
  317.          param1.x = _loc39_ * _loc9_.x + _loc40_ * _loc10_.x + _loc41_ * _loc11_.x;
  318.          param1.y = _loc39_ * _loc9_.y + _loc40_ * _loc10_.y + _loc41_ * _loc11_.y;
  319.          param2.x = _loc39_ * _loc12_.x + _loc40_ * _loc13_.x + _loc41_ * _loc14_.x;
  320.          param2.y = _loc39_ * _loc12_.y + _loc40_ * _loc13_.y + _loc41_ * _loc14_.y;
  321.          return 3;
  322.       }
  323.       
  324.       public static function DistancePC(param1:b2Vec2, param2:b2Vec2, param3:b2PolygonShape, param4:b2XForm, param5:b2CircleShape, param6:b2XForm) : Number
  325.       {
  326.          var _loc7_:b2Mat22 = null;
  327.          var _loc8_:b2Vec2 = null;
  328.          var _loc9_:b2Point = null;
  329.          var _loc10_:Number = NaN;
  330.          var _loc11_:Number = NaN;
  331.          var _loc12_:Number = NaN;
  332.          var _loc13_:Number = NaN;
  333.          var _loc14_:Number = NaN;
  334.          _loc9_ = gPoint;
  335.          _loc8_ = param5.m_localPosition;
  336.          _loc7_ = param6.R;
  337.          _loc9_.p.x = param6.position.x + (_loc7_.col1.x * _loc8_.x + _loc7_.col2.x * _loc8_.y);
  338.          _loc9_.p.y = param6.position.y + (_loc7_.col1.y * _loc8_.x + _loc7_.col2.y * _loc8_.y);
  339.          _loc10_ = DistanceGeneric(param1,param2,param3,param4,_loc9_,b2Math.b2XForm_identity);
  340.          _loc11_ = param5.m_radius - b2Settings.b2_toiSlop;
  341.          if(_loc10_ > _loc11_)
  342.          {
  343.             _loc10_ -= _loc11_;
  344.             _loc12_ = param2.x - param1.x;
  345.             _loc13_ = param2.y - param1.y;
  346.             _loc14_ = Math.sqrt(_loc12_ * _loc12_ + _loc13_ * _loc13_);
  347.             _loc12_ /= _loc14_;
  348.             _loc13_ /= _loc14_;
  349.             param2.x -= _loc11_ * _loc12_;
  350.             param2.y -= _loc11_ * _loc13_;
  351.          }
  352.          else
  353.          {
  354.             _loc10_ = 0;
  355.             param2.x = param1.x;
  356.             param2.y = param1.y;
  357.          }
  358.          return _loc10_;
  359.       }
  360.       
  361.       public static function Distance(param1:b2Vec2, param2:b2Vec2, param3:b2Shape, param4:b2XForm, param5:b2Shape, param6:b2XForm) : Number
  362.       {
  363.          var _loc7_:int = 0;
  364.          var _loc8_:int = 0;
  365.          _loc7_ = param3.m_type;
  366.          _loc8_ = param5.m_type;
  367.          if(_loc7_ == b2Shape.e_circleShape && _loc8_ == b2Shape.e_circleShape)
  368.          {
  369.             return DistanceCC(param1,param2,param3 as b2CircleShape,param4,param5 as b2CircleShape,param6);
  370.          }
  371.          if(_loc7_ == b2Shape.e_polygonShape && _loc8_ == b2Shape.e_circleShape)
  372.          {
  373.             return DistancePC(param1,param2,param3 as b2PolygonShape,param4,param5 as b2CircleShape,param6);
  374.          }
  375.          if(_loc7_ == b2Shape.e_circleShape && _loc8_ == b2Shape.e_polygonShape)
  376.          {
  377.             return DistancePC(param2,param1,param5 as b2PolygonShape,param6,param3 as b2CircleShape,param4);
  378.          }
  379.          if(_loc7_ == b2Shape.e_polygonShape && _loc8_ == b2Shape.e_polygonShape)
  380.          {
  381.             return DistanceGeneric(param1,param2,param3 as b2PolygonShape,param4,param5 as b2PolygonShape,param6);
  382.          }
  383.          return 0;
  384.       }
  385.       
  386.       public static function ProcessTwo(param1:b2Vec2, param2:b2Vec2, param3:Array, param4:Array, param5:Array) : int
  387.       {
  388.          var _loc6_:b2Vec2 = null;
  389.          var _loc7_:b2Vec2 = null;
  390.          var _loc8_:b2Vec2 = null;
  391.          var _loc9_:b2Vec2 = null;
  392.          var _loc10_:b2Vec2 = null;
  393.          var _loc11_:b2Vec2 = null;
  394.          var _loc12_:Number = NaN;
  395.          var _loc13_:Number = NaN;
  396.          var _loc14_:Number = NaN;
  397.          var _loc15_:Number = NaN;
  398.          var _loc16_:Number = NaN;
  399.          var _loc17_:Number = NaN;
  400.          _loc6_ = param5[0];
  401.          _loc7_ = param5[1];
  402.          _loc8_ = param3[0];
  403.          _loc9_ = param3[1];
  404.          _loc10_ = param4[0];
  405.          _loc11_ = param4[1];
  406.          _loc12_ = -_loc7_.x;
  407.          _loc13_ = -_loc7_.y;
  408.          _loc14_ = _loc6_.x - _loc7_.x;
  409.          _loc15_ = _loc6_.y - _loc7_.y;
  410.          _loc16_ = Math.sqrt(_loc14_ * _loc14_ + _loc15_ * _loc15_);
  411.          _loc14_ /= _loc16_;
  412.          _loc15_ /= _loc16_;
  413.          if((_loc17_ = _loc12_ * _loc14_ + _loc13_ * _loc15_) <= 0 || _loc16_ < Number.MIN_VALUE)
  414.          {
  415.             param1.SetV(_loc9_);
  416.             param2.SetV(_loc11_);
  417.             _loc8_.SetV(_loc9_);
  418.             _loc10_.SetV(_loc11_);
  419.             _loc6_.SetV(_loc7_);
  420.             return 1;
  421.          }
  422.          _loc17_ /= _loc16_;
  423.          param1.x = _loc9_.x + _loc17_ * (_loc8_.x - _loc9_.x);
  424.          param1.y = _loc9_.y + _loc17_ * (_loc8_.y - _loc9_.y);
  425.          param2.x = _loc11_.x + _loc17_ * (_loc10_.x - _loc11_.x);
  426.          param2.y = _loc11_.y + _loc17_ * (_loc10_.y - _loc11_.y);
  427.          return 2;
  428.       }
  429.    }
  430. }
  431.